// #include <iostream>
// #include <unistd.h>
// #include <fcntl.h>
// #include <cerrno>
// #include <cstring>

// using namespace std;
// const int SIZE = 1024;

// // 将文件描述符设置为非阻塞
// void SetNonBlock(int fd)
// {
//     int fl =  fcntl(fd, F_GETFL); // 获取当前fd的读写标记位
//     if(fl < 0)
//     {
//         perror("fcntl\n");
//         return;
//     }
//     fcntl(fd, F_SETFL, fl | O_NONBLOCK);
// }

// int main()
// {
//     char buffer[SIZE];
//     SetNonBlock(STDIN_FILENO); // 将标准输入设置为非阻塞

//     while(true)
//     {
//         sleep(2);
//         errno = 0;
//         ssize_t s = read(STDIN_FILENO, buffer, sizeof(buffer) - 1);
//         if(s > 0)
//         {
//             buffer[s - 1] = '\0'; // 去除换行符
//             cout << "echo# " << buffer << endl;
//         }
//         else
//         {
//             if(errno == EWOULDBLOCK || errno == EAGAIN)
//             {
//                 cout << "标准输入仍未就绪！" << errno << " " << strerror(errno) << endl;
//                 continue;
//             }
//             else if(errno == EINTR)
//             {
//                 cout << "标准输入被信号中断！" << errno << " " << strerror(errno) << endl;
//                 continue;
//             }
//             else
//             {
//                 cout << "标准输入出现错误！" << errno << " " << strerror(errno) << endl;
//                 break;
//             }
//         }
//     }

//     return 0;
// }

// #include <fcntl.h>
// #include <unistd.h>
// #include <iostream>

// int main()
// {
//     int fd1 = open("test.txt", O_RDONLY | O_CREAT, 0664);  // 打开一个文件
//     int fd2 = fcntl(fd1, F_DUPFD, 0);  // 复制文件描述符
//     std::cout << "fd1: " << fd1 << std::endl;
//     std::cout << "fd2: " << fd2 << std::endl;
//     return 0;
// }

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

// int main()
// {
//     struct stat sb;
//     int fd = open("Test.txt", O_RDONLY);

//     if (fd == -1)
//     {
//         perror("open");
//         exit(EXIT_FAILURE); // 退出进程
//     }

//     // fstat函数可以获取文件的相关信息
//     if (fstat(fd, &sb) == -1)
//     {
//         perror("fstat");
//         exit(EXIT_FAILURE);
//     }

//     char* mapped = (char*)mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
//     if (mapped == MAP_FAILED)
//     {
//         perror("mmap");
//         exit(EXIT_FAILURE);
//     }

//     for (size_t i = 0; i < sb.st_size; i++)
//     {
//         putchar(mapped[i]);
//         usleep(750);
//     }

//     if (munmap(mapped, sb.st_size) == -1)
//     {
//         perror("munmap");
//         exit(EXIT_FAILURE);
//     }

//     if (close(fd) == -1)
//     {
//         perror("close");
//         exit(EXIT_FAILURE);
//     }

//     return 0;
// }

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

using namespace std;

const int SHARED_MEMORY_SIZE = 4096;  // 共享内存大小

int main() {
    int fd = open("shared_memory.txt", O_RDWR | O_CREAT, 0664);  // 打开文件
    if (fd == -1) {
        perror("open failed");
        return 1;
    }

    if (ftruncate(fd, SHARED_MEMORY_SIZE) == -1) {  // 调整文件大小
        perror("ftruncate failed");
        close(fd);
        return 1;
    }

    void* shared_memory = mmap(NULL, SHARED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  // 将文件映射到内存中
    if (shared_memory == MAP_FAILED) {
        perror("mmap failed");
        close(fd);
        return 1;
    }

    int* p_shared_data = (int*) shared_memory;  // 将指针转换为int类型的指针
    for(int i = 0; i < SHARED_MEMORY_SIZE / sizeof(int); ++i)
    {
        p_shared_data[i] = i;
    }
    
    for(int i = 0; i < SHARED_MEMORY_SIZE / sizeof(int); ++i)
    {
        cout << p_shared_data[i] << endl;
    }

    if (munmap(shared_memory, SHARED_MEMORY_SIZE) == -1) {  // 释放共享内存
        perror("munmap failed");
        close(fd);
        return 1;
    }

    if (close(fd) == -1) {  // 关闭文件
        perror("close failed");
        return 1;
    }

    return 0;
}
